
#include "nane/SoundSystem/SoundBuffer.h"
#include "nane/SoundSystem/SoundBufferImpl_.h"
#include "nane/SoundSystem/SoundSystemImpl_.h"
#include "nane/core/assert.h"

namespace nane 
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    SoundBuffer::SoundBuffer( const NullType& )
        : SubSystemProduct()
        , m( NULL )
    {
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    SoundBuffer::SoundBuffer( Implementation* _impl )
        : SubSystemProduct( _impl )
        , m( _impl )
    {
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    SoundBuffer::SoundBuffer( const SoundBuffer& _other )
        : SubSystemProduct( _other )
        , m( _other.m )
    {
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    byte* SoundBuffer::Lock()
    {
        return m->creator->interface->LockSoundBuffer(m->interface);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void SoundBuffer::Unlock()
    {
        m->creator->interface->UnlockSoundBuffer(m->interface);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 SoundBuffer::GetLengthMs()
    {
        uint64 byteRate = m->frequency * (m->bitsPerSample / 8);
        uint64 ms = static_cast<uint64>(m->size) * 1000 / byteRate;
        return static_cast<uint32>(ms);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
